/**
 * @file DB0.c
 * @author your name (you@domain.com)
 * @brief 第0个数据块
 * @version 0.1
 * @date 2025-04-11
 *
 * @copyright Copyright (c) 2025
 *
 */
#include "DB0.h"
#include "global.h"
#include "stm32f4xx_hal_gpio.h"
#include "db_raw_access.h"
#include "sysconf.h"
#include <string.h>
// 这个是通讯数组

DB0_s  g_DB0_instance;
DB0_s* g_DB0_t = &g_DB0_instance;
// 初始化DB0，可根据需要修改
void init_DB0(void) {
  memset(g_DB0_t, 0, DB0_SIZE); // 清空DB0数据块
  // 有其他操作写在下面
}
void IN_pack_to_buffer(void) {
  // 数字量输入
  for(int i = 0; i < DIQM_NUM_LEN; i++) {
    for(int j = 0; j < DIQM_NUM_PIN; j++) {
      write_bool_be(s7_buffer, S7_BUFFER_SIZE, i, j, &g_DB0_t->I[i][j]);
    }
  }
  // 模拟量-暂定128开始为AI,最多100个
  for(int i = 0; i < AI_NUM_LEN; i++) {
    write_u16_be(s7_buffer, S7_BUFFER_SIZE, i * 2 + DIQM_NUM_LEN, 0, (uint16_t*) &g_DB0_t->AI[i]);
  }
}
void IN_unpack_from_buffer(void) {
  // 数字量输入
  for(int i = 0; i < DIQM_NUM_LEN; i++) {
    for(int j = 0; j < DIQM_NUM_PIN; j++) {
      read_bool_be(s7_buffer, S7_BUFFER_SIZE, i, j, &g_DB0_t->I[i][j]);
    }
  }
  // 模拟量
  for(int i = DIQM_NUM_LEN; i < AI_NUM_LEN; i++) {
    read_u16_be(s7_buffer, S7_BUFFER_SIZE, i, 0, (uint16_t*) &g_DB0_t->AI[i]);
  }
}

void OUT_pack_to_buffer(void) {
  for(int i = 0; i < DIQM_NUM_LEN; i++) {
    for(int j = 0; j < DIQM_NUM_PIN; j++) {
      write_bool_be(s7_buffer, S7_BUFFER_SIZE, i, j, &g_DB0_t->Q_W[i][j]);
    }
  }
}
void OUT_unpack_from_buffer(void) {
  for(int i = 0; i < DIQM_NUM_LEN; i++) {
    for(int j = 0; j < DIQM_NUM_PIN; j++) {
      read_bool_be(s7_buffer, S7_BUFFER_SIZE, i, j, &g_DB0_t->Q_W[i][j]);
    }
  }
}

void MEM_pack_to_buffer(void) {
  for(int i = 0; i < DIQM_NUM_LEN; i++) {
    for(int j = 0; j < DIQM_NUM_PIN; j++) {
      write_bool_be(s7_buffer, S7_BUFFER_SIZE, i, j, &g_DB0_t->M[i][j]);
    }
  }
}
void MEM_unpack_from_buffer(void) {
  for(int i = 0; i < DIQM_NUM_LEN; i++) {
    for(int j = 0; j < DIQM_NUM_PIN; j++) {
      read_bool_be(s7_buffer, S7_BUFFER_SIZE, i, j, &g_DB0_t->M[i][j]);
    }
  }
}

void DB0_pack_to_buffer(uint8_t* buffer, size_t buffer_size) {
  uint16_t byte_offset = 0;
//  // 数字量输入
//  for(int i = 0; i < DIQM_NUM_LEN; i++) {
//    for(int j = 0; j < DIQM_NUM_PIN; j++) {
//      write_bool_be(buffer, buffer_size, i, j, &g_DB0_t->I[i][j]);
//    }
//  }
//  // 模拟量-暂定128开始为AI,最多100个
//  for(int i = 0; i < AI_NUM_LEN; i++) {
//    write_u16_be(buffer, buffer_size, i * 2 + DIQM_NUM_LEN, 0, (uint16_t*) &g_DB0_t->AI[i]);
//  }
//  byte_offset = DIQM_NUM_LEN + AI_NUM_LEN * 2;
//  for(int i = 0; i < DIQM_NUM_LEN; i++) {
//    for(int j = 0; j < DIQM_NUM_PIN; j++) {
//      write_bool_be(buffer, buffer_size, i + byte_offset, j, &g_DB0_t->Q_W[i][j]);
//    }
//  }
//  byte_offset += DIQM_NUM_LEN;
//  for(int i = 0; i < DIQM_NUM_LEN; i++) {
//    for(int j = 0; j < DIQM_NUM_PIN; j++) {
//      write_bool_be(buffer, buffer_size, i, j, &g_DB0_t->M[i][j]);
//    }
//  }
//  byte_offset += DIQM_NUM_LEN;
//  for(int i = 0; i < HSC_NUM; i++) {
//    write_u32_be(buffer, buffer_size, i * 4 + byte_offset, 0, &g_DB0_t->HSC[i]);
//  }
//  byte_offset += HSC_NUM * 4;

  DTL_pack(&g_DB0_t->dateTime, buffer, buffer_size, byte_offset);
  DTL_pack(&g_DB0_t->dateTime_w, buffer, buffer_size, byte_offset + 12);
  write_u32_be(buffer, buffer_size, byte_offset+24, 0, (uint32_t*) &g_DB0_t->sys_run_time);
  write_u16_be(buffer, buffer_size, byte_offset + 28, 0, &g_DB0_t->sys_over_count);
  write_u16_be(buffer, buffer_size, byte_offset + 30, 0, &g_DB0_t->sys_error_code);
  write_bool_be(buffer, buffer_size, byte_offset + 32, 0, &g_DB0_t->sys_set_time);
}
void DB0_unpack_from_buffer(uint8_t* buffer, size_t buffer_size) {
  uint16_t byte_offset = 0;
//  // 数字量输入
//  for(int i = 0; i < DIQM_NUM_LEN; i++) {
//    for(int j = 0; j < DIQM_NUM_PIN; j++) {
//      read_bool_be(buffer, buffer_size, i, j, &g_DB0_t->I[i][j]);
//    }
//  }
//  // 模拟量-暂定128开始为AI,最多100个
//  for(int i = 0; i < AI_NUM_LEN; i++) {
//    read_u16_be(buffer, buffer_size, buffer_size, i * 2 + DIQM_NUM_LEN, (uint16_t*) &g_DB0_t->AI[i]);
//  }
//  byte_offset = DIQM_NUM_LEN + AI_NUM_LEN * 2;
//  for(int i = 0; i < DIQM_NUM_LEN; i++) {
//    for(int j = 0; j < DIQM_NUM_PIN; j++) {
//      read_bool_be(buffer, buffer_size, i + byte_offset, j, &g_DB0_t->Q_W[i][j]);
//    }
//  }
//  byte_offset += DIQM_NUM_LEN;
//  for(int i = 0; i < DIQM_NUM_LEN; i++) {
//    for(int j = 0; j < DIQM_NUM_PIN; j++) {
//      read_bool_be(buffer, buffer_size, i, j, &g_DB0_t->M[i][j]);
//    }
//  }
//  byte_offset += DIQM_NUM_LEN;
//  for(int i = 0; i < HSC_NUM; i++) {
//    read_u32_be(buffer, buffer_size, i * 4 + byte_offset, 0, &g_DB0_t->HSC[i]);
//  }
//  byte_offset += HSC_NUM * 4;

  DTL_unpack(&g_DB0_t->dateTime, buffer, buffer_size, byte_offset);
  DTL_unpack(&g_DB0_t->dateTime_w, buffer, buffer_size, byte_offset + 12);
  read_u32_be(buffer, buffer_size, byte_offset+ 24, 0, (uint32_t*) &g_DB0_t->sys_run_time);
  read_u16_be(buffer, buffer_size, byte_offset + 28, 0, &g_DB0_t->sys_over_count);
  read_u16_be(buffer, buffer_size, byte_offset + 30, 0, &g_DB0_t->sys_error_code);
  read_bool_be(buffer, buffer_size, byte_offset + 32, 0, &g_DB0_t->sys_set_time);
  // NOTE 将时间赋值给系统运行时间
  system_run_time = g_DB0_t->sys_run_time;
}